<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="t5Sy9" id="t5Sy9"><span data-lake-id="uf86f08b3" id="uf86f08b3" style="color: #000000">典型回答</span></h1>
  <p data-lake-id="u47b8ebbb" id="u47b8ebbb"><span data-lake-id="u5cfe50f9" id="u5cfe50f9" style="color: #000000">​</span><br></p>
  <p data-lake-id="u65d39166" id="u65d39166"><span data-lake-id="u60035c6c" id="u60035c6c" style="color: #000000">HTTP/2主要是解决HTTP中存在的效率问题。它主要引入了二进制分帧、多路复用、header压缩、以及服务端推送的新特性，大大的提升了效率。</span></p>
  <p data-lake-id="u1fa880b8" id="u1fa880b8"><span data-lake-id="u65417907" id="u65417907" style="color: #000000">​</span><br></p>
  <p data-lake-id="uf80ab11b" id="uf80ab11b"><span data-lake-id="ud924b1b9" id="ud924b1b9" style="color: #000000">而且，在HTTP/2中还解决了一个重要的问题，那就是HTTP的队头阻塞问题。</span></p>
  <p data-lake-id="u05559e84" id="u05559e84"><span data-lake-id="u52163971" id="u52163971" style="color: #000000">​</span><br></p>
  <h1 data-lake-id="vF5WQ" id="vF5WQ"><span data-lake-id="ue5c74d17" id="ue5c74d17" style="color: #000000">扩展知识</span></h1>
  <h2 data-lake-id="jivXf" id="jivXf"><span data-lake-id="ua311b19f" id="ua311b19f" style="color: #000000">HTTP</span></h2>
  <p data-lake-id="u98b3ab5c" id="u98b3ab5c"><span data-lake-id="u20b238f4" id="u20b238f4" style="color: #000000">​</span><br></p>
  <p data-lake-id="ue1d94bc8" id="ue1d94bc8"><span data-lake-id="uc4b661e8" id="uc4b661e8" style="color: #000000">超文本传输协议（英文：HyperText Transfer Protocol，缩写：HTTP）是一种用于分布式、协作式和超媒体信息系统的应用层协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符（Uniform Resource Identifiers，URI）来标识。</span></p>
  <p data-lake-id="uce544f3c" id="uce544f3c"><span data-lake-id="u7698871f" id="u7698871f" style="color: #000000">​</span><br></p>
  <p data-lake-id="ud63e392b" id="ud63e392b"><span data-lake-id="u12bdcfd0" id="u12bdcfd0" style="color: #000000">HTTP 协议是以 ASCII 码传输，基于请求与响应模式的、无状态的，建立在 TCP/IP 协议之上的应用层规范。。它不涉及数据包（packet）传输，主要规定了客户端和服务器之间的通信格式，默认使用80端口。</span></p>
  <p data-lake-id="uc5f435c7" id="uc5f435c7"><span data-lake-id="u0782345c" id="u0782345c" style="color: #000000">​</span><br></p>
  <p data-lake-id="u307add3c" id="u307add3c"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/http.jpg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_13%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u9839def4" id="u9839def4"><span data-lake-id="uda82c505" id="uda82c505" style="color: #000000">​</span><br></p>
  <p data-lake-id="uc52027eb" id="uc52027eb"><span data-lake-id="u35aded45" id="u35aded45" style="color: #000000">HTTP协议主要的版本有3个，分别是HTTP/1.0、HTTP/1.1和HTTP/2。HTTPS是另外一个协议，简单讲是HTTP的安全版。</span></p>
  <p data-lake-id="u55ae82eb" id="u55ae82eb"><span data-lake-id="u49f9965b" id="u49f9965b" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="shQPY" id="shQPY"><span data-lake-id="u65c3ff6b" id="u65c3ff6b" style="color: #000000">HTTP/1.0</span></h3>
  <p data-lake-id="u26cca9b3" id="u26cca9b3"><span data-lake-id="ua0a9f45d" id="ua0a9f45d" style="color: #000000">​</span><br></p>
  <p data-lake-id="u8cb36872" id="u8cb36872"><span data-lake-id="ub177f79b" id="ub177f79b" style="color: #000000">1996年5月，HTTP/1.0 版本发布，为了提高系统的效率，HTTP/1.0规定浏览器与服务器只保持短暂的连接，浏览器的每次请求都需要与服务器建立一个TCP连接，服务器完成请求处理后立即断开TCP连接，服务器不跟踪每个客户也不记录过去的请求。</span></p>
  <p data-lake-id="ubc0b01d8" id="ubc0b01d8"><span data-lake-id="udd6ffed2" id="udd6ffed2" style="color: #000000">​</span><br></p>
  <p data-lake-id="u90134278" id="u90134278"><span data-lake-id="udc685ac3" id="udc685ac3" style="color: #000000">请注意上面提到的HTTP/1.0中浏览器与服务器只保持短暂的连接，连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕，连接就关闭，如果还要请求其他资源，就必须再新建一个连接。</span></p>
  <p data-lake-id="ud6327eaf" id="ud6327eaf"><span data-lake-id="u34634489" id="u34634489" style="color: #000000">​</span><br></p>
  <p data-lake-id="ua245d7b6" id="ua245d7b6"><span data-lake-id="ue0d6ed15" id="ue0d6ed15" style="color: #000000">我们知道TCP连接的建立需要三次握手，是很耗费时间的一个过程。所以，HTTP/1.0版本的性能比较差。现在，随便打开一个网页，上面都会有很多图片、视频等资源，HTTP/1.0显然无法满足性能要求。</span></p>
  <p data-lake-id="ube40ba55" id="ube40ba55"><span data-lake-id="u8cb3f8ba" id="u8cb3f8ba" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="gtx7W" id="gtx7W"><span data-lake-id="uae3f59e2" id="uae3f59e2" style="color: #000000">HTTP/1.1</span></h3>
  <p data-lake-id="u13f7657a" id="u13f7657a"><span data-lake-id="ue6f01575" id="ue6f01575" style="color: #000000">​</span><br></p>
  <p data-lake-id="uce0d871e" id="uce0d871e"><span data-lake-id="ud0787418" id="ud0787418" style="color: #000000">为了解决HTTP/1.0存在的缺陷，HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说，最主要的改进就是引入了持久连接。所谓的持久连接就是：在一个TCP连接上可以传送多个HTTP请求和响应，减少了建立和关闭连接的消耗和延迟。</span></p>
  <p data-lake-id="u9874439e" id="u9874439e"><span data-lake-id="u8746945a" id="u8746945a" style="color: #000000">​</span><br></p>
  <p data-lake-id="ue79a221f" id="ue79a221f"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/1.0-1.1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_13%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ua428eb68" id="ua428eb68"><span data-lake-id="ue4cbf5fb" id="ue4cbf5fb" style="color: #000000">​</span><br></p>
  <p data-lake-id="u3852d5c2" id="u3852d5c2"><span data-lake-id="u5e543695" id="u5e543695" style="color: #000000">引入了持久连接之后，在性能方面，HTTP协议有了明显的提升，基本可以用于日常使用，这也是这一版本一直延用至今的原因。当然还是有些力不从心的，后面会详细介绍。</span></p>
  <p data-lake-id="u15a58ecf" id="u15a58ecf"><span data-lake-id="uca09903a" id="uca09903a" style="color: #000000">​</span><br></p>
  <p data-lake-id="ufa0885ce" id="ufa0885ce"><span data-lake-id="u23212c96" id="u23212c96" style="color: #000000">关于HTTP/1.0和HTTP/1.1还有些其他区别，这里就不展开介绍了。网上也很多资料，可以自行查阅。</span></p>
  <p data-lake-id="u3c47f1a6" id="u3c47f1a6"><span data-lake-id="u8c632cba" id="u8c632cba" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="H5MxE" id="H5MxE"><span data-lake-id="uf3ed9678" id="uf3ed9678" style="color: #000000">SPDY</span></h3>
  <p data-lake-id="u61202b28" id="u61202b28"><span data-lake-id="uadd1ebe7" id="uadd1ebe7" style="color: #000000">​</span><br></p>
  <p data-lake-id="uf294826c" id="uf294826c"><span data-lake-id="udedb24e4" id="udedb24e4" style="color: #000000">虽然，HTTP/1.1在HTTP/1.0的基础上提供了持久连接，提升了很大的效率，但是，还是有很大的提升空间。</span></p>
  <p data-lake-id="uf7c7c08d" id="uf7c7c08d"><span data-lake-id="uf4ece591" id="uf4ece591" style="color: #000000">​</span><br></p>
  <p data-lake-id="uca92eb3f" id="uca92eb3f"><span data-lake-id="u625978aa" id="u625978aa" style="color: #000000">正所谓时势造英雄，正是因为HTTP存在着诸多不足，所以，才诞生了SPDY。2009年，谷歌公开了自行研发的 SPDY 协议，主要解决 HTTP/1.1 效率不高的问题。它的设计目标是降低 50% 的页面加载时间。SPDY主要提供了以下功能（后文介绍HTTP2的时候再详细介绍）：</span></p>
  <p data-lake-id="uf4505978" id="uf4505978"><span data-lake-id="u0012dbc2" id="u0012dbc2" style="color: #000000">​</span><br></p>
  <ul list="u908d79d8">
   <li fid="u7754c6aa" data-lake-id="ued7dafc4" id="ued7dafc4"><span data-lake-id="u852aa11a" id="u852aa11a" style="color: #000000">多路复用（multiplexing）。多个请求共享一个tcp连接。</span></li>
   <li fid="u7754c6aa" data-lake-id="ub1133967" id="ub1133967"><span data-lake-id="u8a330a9f" id="u8a330a9f" style="color: #000000">header压缩。删除或者压缩HTTP头</span></li>
   <li fid="u7754c6aa" data-lake-id="ue05ffd86" id="ue05ffd86"><span data-lake-id="u019a7dec" id="u019a7dec" style="color: #000000">服务端推送。提供服务方发起通信，并向客户端推送数据的机制。</span></li>
  </ul>
  <p data-lake-id="u4a0205a0" id="u4a0205a0"><span data-lake-id="u5fff6ca3" id="u5fff6ca3" style="color: #000000">​</span><br></p>
  <p data-lake-id="uee780454" id="uee780454"><span data-lake-id="ud617928d" id="ud617928d" style="color: #000000">SPDY位于HTTP之下，TCP和SSL之上，这样可以轻松兼容老版本的HTTP协议。</span></p>
  <p data-lake-id="uda86aa23" id="uda86aa23"><span data-lake-id="ud328612f" id="ud328612f" style="color: #000000">​</span><br></p>
  <p data-lake-id="ubfb8e028" id="ubfb8e028"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/spdy.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_22%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u9e10c636" id="u9e10c636"><span data-lake-id="ue3910d8c" id="ue3910d8c" style="color: #000000">​</span><br></p>
  <p data-lake-id="u0a778a73" id="u0a778a73"><span data-lake-id="uc2070ac5" id="uc2070ac5" style="color: #000000">实际上在 HTTP2 提出来之前，SPDY 流行了很长一段时间。当下很多著名的互联网公司都在自己的网站或 APP 中采用了 SPDY 系列协议（当前最新版本是 SPDY/3.1），因为它对性能的提升是显而易见的。主流的浏览器（谷歌、火狐、Opera）也都早已经支持 SPDY，它已经成为了工业标准。HTTP Working-Group 最终决定以 SPDY/2 为基础，开发 HTTP/2。</span></p>
  <p data-lake-id="u6a278f91" id="u6a278f91"><span data-lake-id="uafa0408a" id="uafa0408a" style="color: #000000">​</span><br></p>
  <h2 data-lake-id="JC7Yk" id="JC7Yk"><span data-lake-id="ud6c0e32c" id="ud6c0e32c" style="color: #000000">HTTP/2</span></h2>
  <p data-lake-id="u8ac87a7d" id="u8ac87a7d"><span data-lake-id="uefc17b6f" id="uefc17b6f" style="color: #000000">​</span><br></p>
  <p data-lake-id="u0b3fda72" id="u0b3fda72"><span data-lake-id="u75cd9bff" id="u75cd9bff" style="color: #000000">下图是Akamai 公司建立的一个官方的演示，主要用来说明在性能上HTTP/1.1和HTTP/2在性能升的差别。同时请求 379 张图片，HTTP/1.1加载用时4.54s，HTTP/2加载用时1.47s。</span></p>
  <p data-lake-id="ub5e269da" id="ub5e269da"><span data-lake-id="u5c5d5c07" id="u5c5d5c07" style="color: #000000">​</span><br></p>
  <p data-lake-id="u5259267f" id="u5259267f"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/http21.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_26%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u9cc34cfb" id="u9cc34cfb"><span data-lake-id="ucb66b3fa" id="ucb66b3fa" style="color: #000000">​</span><br></p>
  <p data-lake-id="u1f3522dc" id="u1f3522dc"><span data-lake-id="u2543b8cc" id="u2543b8cc" style="color: #000000">HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新，主要基于 SPDY 协议。由互联网工程任务组（IETF）的 Hypertext Transfer Protocol Bis（httpbis）工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论，于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。</span></p>
  <p data-lake-id="u256143ee" id="u256143ee"><span data-lake-id="u61003977" id="u61003977" style="color: #000000">​</span><br></p>
  <p data-lake-id="u69815c35" id="u69815c35"><span data-lake-id="udad4f0dc" id="udad4f0dc" style="color: #000000">下面来看下，HTTP/2相对于HTTP/1.1有哪些改进：</span></p>
  <p data-lake-id="u67c31f4b" id="u67c31f4b"><span data-lake-id="u9e89a240" id="u9e89a240" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="DPv3a" id="DPv3a"><span data-lake-id="u132f6171" id="u132f6171" style="color: #000000">二进制分帧</span></h3>
  <p data-lake-id="u93423cb7" id="u93423cb7"><span data-lake-id="u607d4d54" id="u607d4d54" style="color: #000000">​</span><br></p>
  <p data-lake-id="u64a3d2ed" id="u64a3d2ed"><span data-lake-id="udd33267a" id="udd33267a" style="color: #000000">在HTTP/2中，在应用层（HTTP2.0）和传输层（TCP或者UDP）之间加了一层：二进制分帧层。这是HTTP2中最大的改变。HTTP2之所以性能会比HTTP1.1有那么大的提高，很大程度上正是由于这一层的引入。</span></p>
  <p data-lake-id="udf364e95" id="udf364e95"><span data-lake-id="ud67ea725" id="ud67ea725" style="color: #000000">​</span><br></p>
  <p data-lake-id="u507b669c" id="u507b669c"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/frame-layer.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_15%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uc0141403" id="uc0141403"><span data-lake-id="u5648560a" id="u5648560a" style="color: #000000">​</span><br></p>
  <p data-lake-id="ubb664664" id="ubb664664"><span data-lake-id="u3dba681b" id="u3dba681b" style="color: #000000">在二进制分帧层中， HTTP/2 会将所有传输的信息分割为更小的消息和帧（frame）,并对它们采用二进制格式的编码。</span></p>
  <p data-lake-id="u30d57705" id="u30d57705"><span data-lake-id="uedecda49" id="uedecda49" style="color: #000000">​</span><br></p>
  <p data-lake-id="u748e4d08" id="u748e4d08"><span data-lake-id="u9427cb3d" id="u9427cb3d" style="color: #000000">这种单连接多资源的方式，减少了服务端的压力，使得内存占用更少，连接吞吐量更大。而且，TCP连接数的减少使得网络拥塞状况得以改善，同时慢启动时间的减少，使拥塞和丢包恢复速度更快。</span></p>
  <p data-lake-id="uaaca5768" id="uaaca5768"><span data-lake-id="u9397452a" id="u9397452a" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="lnfMR" id="lnfMR"><span data-lake-id="u47709e4a" id="u47709e4a" style="color: #000000">多路复用</span></h3>
  <p data-lake-id="uc4fbaaaa" id="uc4fbaaaa"><span data-lake-id="u8fd6b41f" id="u8fd6b41f" style="color: #000000">​</span><br></p>
  <p data-lake-id="ub29f7b13" id="ub29f7b13"><span data-lake-id="u290f876f" id="u290f876f" style="color: #000000">多路复用允许同时通过单一的HTTP/2.0连接发起多重的请求-响应消息。在HTTP1.1协议中，浏览器客户端在同一时间，针对同一域名下的请求有一定数量的限制，超过了这个限制的请求就会被阻塞。而多路复用允许同时通过单一的 HTTP2.0 连接发起多重的“请求-响应”消息。</span></p>
  <p data-lake-id="ue3f3fd93" id="ue3f3fd93"><span data-lake-id="uee5b4e4d" id="uee5b4e4d" style="color: #000000">​</span><br></p>
  <p data-lake-id="u77d1edec" id="u77d1edec"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/IMG_1960.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_31%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u58f51ae0" id="u58f51ae0"><span data-lake-id="u64a0ae71" id="u64a0ae71" style="color: #000000">​</span><br></p>
  <p data-lake-id="uc4815898" id="uc4815898"><span data-lake-id="ucd9f5d89" id="ucd9f5d89" style="color: #000000">HTTP2的请求的TCP的connection一旦建立，后续请求以stream的方式发送。每个stream的基本组成单位是frame（二进制帧）。客户端和服务器可以把 HTTP 消息分解为互不依赖的帧，然后乱序发送，最后再在另一端把它们重新组合起来。</span></p>
  <p data-lake-id="ub373f5f4" id="ub373f5f4"><span data-lake-id="u2b072d50" id="u2b072d50" style="color: #000000">​</span><br></p>
  <p data-lake-id="uc99bd4c4" id="uc99bd4c4"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/multi.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_18%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uf538f13c" id="uf538f13c"><span data-lake-id="ud4bbcdd7" id="ud4bbcdd7" style="color: #000000">​</span><br></p>
  <p data-lake-id="uae50374a" id="uae50374a"><span data-lake-id="uaa3b8376" id="uaa3b8376" style="color: #000000">也就是说， HTTP2.0 通信都在一个连接上完成，这个连接可以承载任意数量的双向数据流。就好比，我请求一个页面 </span><a href="http://www.hollischuang.com" target="_blank" data-lake-id="u908c81dd" id="u908c81dd"><span data-lake-id="u2f14a209" id="u2f14a209" style="color: #000000">http://www.hollischuang.com</span></a><span data-lake-id="u833edcfd" id="u833edcfd" style="color: #000000"> 。页面上所有的资源请求都是客户端与服务器上的一条 TCP 上请求和响应的！</span></p>
  <p data-lake-id="u0712314c" id="u0712314c"><span data-lake-id="uf857ffed" id="uf857ffed" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="YzWBT" id="YzWBT"><span data-lake-id="u1606b113" id="u1606b113" style="color: #000000">header压缩</span></h3>
  <p data-lake-id="uc1ee0775" id="uc1ee0775"><span data-lake-id="u7306b7f7" id="u7306b7f7" style="color: #000000">​</span><br></p>
  <p data-lake-id="uc06c44c0" id="uc06c44c0"><span data-lake-id="u4e5de689" id="u4e5de689" style="color: #000000">HTTP/1.1的header带有大量信息，而且每次都要重复发送。HTTP/2 为了减少这部分开销，采用了HPACK 头部压缩算法对Header进行压缩。</span></p>
  <p data-lake-id="u85d5a220" id="u85d5a220"><span data-lake-id="uac5857f3" id="uac5857f3" style="color: #000000">​</span><br></p>
  <p data-lake-id="ue60ef850" id="ue60ef850"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/header.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_22%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ub722ddec" id="ub722ddec"><span data-lake-id="u19b1cfc4" id="u19b1cfc4" style="color: #000000">​</span><br></p>
  <h3 data-lake-id="q8IZN" id="q8IZN"><span data-lake-id="u0af53381" id="u0af53381" style="color: #000000">服务端推送</span></h3>
  <p data-lake-id="u99bb388c" id="u99bb388c"><span data-lake-id="u57471233" id="u57471233" style="color: #000000">​</span><br></p>
  <p data-lake-id="u36c6926d" id="u36c6926d"><span data-lake-id="u2dc1a48c" id="u2dc1a48c" style="color: #000000">简单来讲就是当用户的浏览器和服务器在建立连接后，服务器主动将一些资源推送给浏览器并缓存起来的机制。有了缓存，当浏览器想要访问已缓存的资源的时候就可以直接从缓存中读取了。</span></p>
  <p data-lake-id="u97cc2649" id="u97cc2649"><span data-lake-id="u6cc1c7f1" id="u6cc1c7f1" style="color: #000000">​</span><br></p>
  <p data-lake-id="u411ab149" id="u411ab149"><img src="http://www.hollischuang.com/wp-content/uploads/2018/03/push.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_15%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ubbf12db3" id="ubbf12db3"><span data-lake-id="u29b9783a" id="u29b9783a" style="color: #000000">​</span><br></p>
  <h2 data-lake-id="aoJZo" id="aoJZo"><span data-lake-id="u9f3df3d5" id="u9f3df3d5" style="color: #000000">HTTP队头阻塞</span></h2>
  <p data-lake-id="u7ac88bc2" id="u7ac88bc2"><span data-lake-id="u0bf6a94b" id="u0bf6a94b" style="color: #000000">​</span><br></p>
  <p data-lake-id="u1f84bd26" id="u1f84bd26" style="text-align: justify"><span data-lake-id="u39845dd5" id="u39845dd5" class="lake-fontsize-12" style="color: #000000">队头阻塞翻译自英文head-of-line blocking，这个词并不新鲜，因为早在HTTP/1.1时代，就一直存在着队头阻塞的问题。</span></p>
  <p data-lake-id="ucc1139fc" id="ucc1139fc" style="text-align: justify"><span data-lake-id="uab7b3675" id="uab7b3675" class="lake-fontsize-12" style="color: #000000">但是很多人在一些资料中会看到有论点说HTTP/2解决了队头阻塞的问题。但是这句话只对了一半。</span></p>
  <p data-lake-id="uf0c5915e" id="uf0c5915e" style="text-align: justify"><strong><span data-lake-id="u3e6c5595" id="u3e6c5595" class="lake-fontsize-12" style="color: #000000">只能说HTTP/2解决了HTTP的队头阻塞问题，但是并没有解决TCP队头阻塞问题！</span></strong></p>
  <p data-lake-id="ufadeffb5" id="ufadeffb5" style="text-align: justify"><span data-lake-id="uc3342820" id="uc3342820" class="lake-fontsize-12" style="color: #000000">如果大家对于HTTP的历史有一定的了解的话，就会知道。HTTP/1.1相比较于HTTP/1.0来说，最主要的改进就是引入了持久连接（keep-alive）。</span></p>
  <p data-lake-id="u4d2e50e3" id="u4d2e50e3" style="text-align: justify"><strong><span data-lake-id="ud55b62d2" id="ud55b62d2" class="lake-fontsize-12" style="color: #000000">所谓的持久连接就是：在一个TCP连接上可以传送多个HTTP请求和响应，减少了建立和关闭连接的消耗和延迟。</span></strong></p>
  <p data-lake-id="u1fe4f42e" id="u1fe4f42e" style="text-align: justify"><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1668598205182-21b6c964-9b6f-4b72-bd48-f69b429de2c0.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_52%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u8d0ccd5e" id="u8d0ccd5e" style="text-align: justify"><span data-lake-id="u8d22163e" id="u8d22163e" class="lake-fontsize-12" style="color: #000000">引入了持久连接之后，在性能方面，HTTP协议有了明显的提升。</span></p>
  <p data-lake-id="u1f1aadd3" id="u1f1aadd3" style="text-align: justify"><span data-lake-id="u9ba14a08" id="u9ba14a08" class="lake-fontsize-12" style="color: #000000">另外，HTTP/1.1允许在持久连接上使用请求管道，是相对于持久连接的又一性能优化。</span></p>
  <p data-lake-id="uac8165f4" id="uac8165f4" style="text-align: justify"><span data-lake-id="u83e002a8" id="u83e002a8" class="lake-fontsize-12" style="color: #000000">所谓请求管道，就是在HTTP响应到达之前，可以将多条请求放入队列，当第一条HTTP请求通过网络流向服务器时，第二条和第三条请求也可以开始发送了。在高时延网络条件下，这样做可以降低网络的环回时间，提高性能。</span></p>
  <p data-lake-id="u14719203" id="u14719203" style="text-align: justify"><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1668598205173-4c874605-cfb7-40dd-b237-08fa8d3bb18d.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_29%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u75706021" id="u75706021" style="text-align: justify"><strong><span data-lake-id="ub4fdbbff" id="ub4fdbbff" class="lake-fontsize-12" style="color: #000000">但是，对于管道连接还是有一定的限制和要求的，其中一个比较关键的就是服务端必须按照与请求相同的顺序回送HTTP响应。</span></strong></p>
  <p data-lake-id="u9f8cc17c" id="u9f8cc17c" style="text-align: justify"><span data-lake-id="u97e6df5b" id="u97e6df5b" class="lake-fontsize-12" style="color: #000000">这也就意味着，如果一个响应返回发生了延迟，那么其后续的响应都会被延迟，直到队头的响应送达。这就是所谓的</span><strong><span data-lake-id="u22a9d026" id="u22a9d026" class="lake-fontsize-12" style="color: #000000">HTTP队头阻塞</span></strong><span data-lake-id="u96cd1ae6" id="u96cd1ae6" class="lake-fontsize-12" style="color: #000000">。</span></p>
  <p data-lake-id="udc2fc5b2" id="udc2fc5b2" style="text-align: justify"><span data-lake-id="ue5290106" id="ue5290106" class="lake-fontsize-12" style="color: #000000">但是HTTP队头阻塞的问题在HTTP/2中得到了有效的解决。</span><strong><span data-lake-id="u6cb55134" id="u6cb55134" class="lake-fontsize-12" style="color: #000000">HTTP/2废弃了管道化的方式</span></strong><span data-lake-id="ua41bb55d" id="ua41bb55d" class="lake-fontsize-12" style="color: #000000">，而是创新性的引入了帧、消息和数据流等概念。</span><strong><span data-lake-id="u38ed3c05" id="u38ed3c05" class="lake-fontsize-12" style="color: #000000">客户端和服务器可以把 HTTP 消息分解为互不依赖的帧，然后乱序发送，最后再在另一端把它们重新组合起来。</span></strong></p>
  <p data-lake-id="u4fb2417c" id="u4fb2417c" style="text-align: justify"><img src="https://cdn.nlark.com/yuque/0/2022/jpeg/5378072/1668598205169-b306cc37-62f0-4e8f-b02c-29c2e27d6e82.jpeg?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_56%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uf7c80302" id="uf7c80302" style="text-align: justify"><strong><span data-lake-id="u66366dfa" id="u66366dfa" class="lake-fontsize-12" style="color: #000000">因为没有顺序了，所以就不需要阻塞了，就有效的解决了HTTP队头阻塞的问题。</span></strong></p>
  <p data-lake-id="ua4fc8968" id="ua4fc8968"><br></p>
 </body>
</html>